package sprint1;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;

/**
 *
 * @author vincentvanandel
 * @author Fabian Mengerink
 *
 */
public class Location {
	private String naam;
	private String filename;
	private int nr;
	private int con1;
	private int con2;
	private int con3;
	private int con4;
	private int con5;
	private int object;
	private int monster;
	private ArrayList<Location> connectingLocations;
	private static ArrayList<Location> locations;
	private static Location chamber1 = new Chamber("Ingang", "kamer1.txt", 1,
			2, 3, 4, 0, 0, 0, 0);
	private static Location chamber2 = new Chamber("Hal", "kamer2.txt", 2, 1,
			7, 0, 0, 0, 0, 0);
	private static Location chamber3 = new Chamber("Zijkamer", "kamer3.txt", 3,
			1, 0, 0, 0, 0, 0, 0);
	private static Location chamber4 = new Chamber("Tussenkamer", "kamer4.txt",
			4, 1, 5, 0, 0, 0, 0, 0);
	private static Location teleport5 = new Teleport("Teleporter",
			"kamer5.txt", 5, 4, 6, 0, 0, 0, 0, 0, 1);
	private static Location chamber6 = new Chamber("Planeet1", "kamer6.txt", 6,
			8, 0, 0, 0, 0, 0, 0);
	private static Location chamber7 = new Chamber("Keykamer", "kamer7.txt", 7,
			2, 0, 0, 0, 0, 1, 0); // ook de locatie van de key
	private static Location chamber8 = new Chamber("Planeet2", "kamer8.txt", 8,
			9, 10, 0, 0, 0, 0, 0);
	private static Location chamber9 = new Chamber("Planeet3", "kamer9.txt", 9,
			10, 8, 0, 0, 0, 0, 0);
	private static Location chamber10 = new Chamber("Planeet4", "kamer10.txt",
			10, 9, 8, 11, 0, 0, 0, 0);
	private static Location chamber11 = new Chamber("Planeet5", "kamer11.txt",
			11, 10, 12, 0, 0, 0, 0, 0);
	private static Location ruimteschip = new Chamber("Ruimteschip",
			"kamer12.txt", 12, 13, 0, 0, 0, 0, 0, 0);
	private static Location schip1 = new Spaceship("Welkomsruimte",
			"kamer13.txt", 13, 14, 0, 0, 0, 0, 0, 0);
	private static Location schip2 = new Spaceship("Commandcenter",
			"kamer14.txt", 14, 0, 0, 0, 0, 0, 0, 4);

	/**
	 * De constructor van Locatie. Kan zowel een kamer (Chamber) als een teleporter zijn.
	 *
	 * @param naam
	 *            de naam van de kamer (wordt gebruikt in de toString van de methode)
	 * @param filename
	 *            de naam van de file waar de grafische weergave van de kamer instaat
	 * @param nr
	 *            de [b]unieke nummer[/b] van de kamer. Wordt in een aantal methodes gebruikt, dus let goed op!!
	 * @param con1
	 *            de kamer waaraan de desbetreffende kamer is verbonden. Als de kamer maar twee aansluitende kamers
	 *            heeft, de rest op 0 zetten. Zie bijgeleverde Word-document.
	 * @param con2
	 *            de kamer waaraan de desbetreffende kamer is verbonden. Als de kamer maar twee aansluitende kamers
	 *            heeft, de rest op 0 zetten. Zie bijgeleverde Word-document.
	 * @param con3
	 *            de kamer waaraan de desbetreffende kamer is verbonden. Als de kamer maar twee aansluitende kamers
	 *            heeft, de rest op 0 zetten. Zie bijgeleverde Word-document.
	 * @param con4
	 *            de kamer waaraan de desbetreffende kamer is verbonden. Als de kamer maar twee aansluitende kamers
	 *            heeft, de rest op 0 zetten. Zie bijgeleverde Word-document.
	 * @param con5
	 *            de kamers waaraan de desbetreffende kamer is verbonden. Als de kamer maar twee aansluitende kamers
	 *            heeft, de rest op 0 zetten. Zie bijgeleverde Word-document.
	 * @param object
	 *            als het nummer van deze int op 0 staat is er geen object in de kamer; als het getal niet 0 is, dan is
	 *            het cijfer de index van de arraylist.
	 * @param monster
	 *            als het nummer van deze int op 0 staat is er geen monster in de kamer, als de int op 1-3 staat is er
	 *            een random kans dat er een monster in de kamer is. Op een 4 of hoger is er een specifieke alien
	 *            aanwezig.
	 */
	public Location(String naam, String filename, int nr, int con1, int con2,
			int con3, int con4, int con5, int object, int monster) {
		this.naam = naam;
		this.filename = filename;
		this.nr = nr;
		this.con1 = con1;
		this.con2 = con2;
		this.con3 = con3;
		this.con4 = con4;
		this.con5 = con5;
		this.object = object;
		this.monster = monster;
	}

	/**
	 *
	 * @param nr
	 * @return Een ArrayList met de connecterende kamers
	 */
	public ArrayList<Location> ArrayList(int nr) {
		Location location = getLocation(nr);
		int con1 = location.getCon1();
		int con2 = location.getCon2();
		int con3 = location.getCon3();
		int con4 = location.getCon4();
		int con5 = location.getCon5();
		connectingLocations = new ArrayList<Location>();
		for (Location l : locations) {
			if (con1 == l.getNr()) {
				connectingLocations.add(getLocation(l.getNr()));
			}
			if (con2 == l.getNr()) {
				connectingLocations.add(getLocation(l.getNr()));
			}
			if (con3 == l.getNr()) {
				connectingLocations.add(getLocation(l.getNr()));
			}
			if (con4 == l.getNr()) {
				connectingLocations.add(getLocation(l.getNr()));
			}
			if (con5 == l.getNr()) {
				connectingLocations.add(getLocation(l.getNr()));
			}
		}
		return connectingLocations;
	}

	public static Location getLocation(int nr) {
		for (Location l : locations) {
			if (l.getNr() == nr) {
				return l;
			}
		}
		return null;
	}

	public String getFileName() {
		return filename;
	}

	static ArrayList<Location> addLocation() {
		locations = new ArrayList<Location>();
		locations.add(chamber1);
		locations.add(chamber2);
		locations.add(chamber3);
		locations.add(chamber4);
		locations.add(teleport5);
		locations.add(chamber6);
		locations.add(chamber7); // tevens de plek waar de sleutel ligt
		locations.add(chamber8);
		locations.add(chamber9);
		locations.add(chamber10);
		locations.add(chamber11);
		locations.add(ruimteschip);
		locations.add(schip1);
		locations.add(schip2); // alien ruimte
		return locations;
	}

	public int getCon1() {
		return this.con1;
	}

	private int getCon2() {
		return this.con2;
	}

	private int getCon3() {
		return this.con3;
	}

	private int getCon4() {
		return this.con4;
	}

	private int getCon5() {
		return this.con5;
	}

	public String getNaam() {
		return this.naam;
	}

	public int getNr() {
		return this.nr;
	}

	static void printOut(String filename) {
		BufferedReader in = null;
		try {
			File file = new File("trunk/locations/" + filename);
			in = new BufferedReader(new FileReader(file));
		} catch (FileNotFoundException e) {
			System.out.println("The file doesn't exist.");
			System.exit(0);
		} catch (IOException e) {
			System.out.println("I/O Error");
			System.exit(0);
		}
		try {
			while (in.ready()) {
				System.out.println(in.readLine());
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public void setObject(int object) {
		this.object = object;
	}

	public int getObject() {
		return object;
	}

	public void setMonster(int monster) {
		this.monster = monster;
	}

	public int getMonster() {
		return monster;
	}
}
